﻿
@*创建 model 的 "强类型 View " *@
@model WebAppMVCTest01.Models.Employee

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>MyViewEmp01</title>
</head>
<body>
    <div>
        @***************************************************************************************************************************
            * Razor 代码 :
            * * 是服务器端标记语言, 向网页中嵌入基于服务器的代码的标记语法;
            * * 在网页加载时, 服务器在向浏览器返回页面之前会先执行页面内的基于服务器的代码.
            * * 1. @{ ..语句.. }    花括号内可以写 C# 或 VB 语句, 每句代码结尾记得写 分号 ; C# 对应 .cshtml 而 VB 对应 .vbhtml
            * * 2. @变量或表达式    行内表达式, 简单地显示变量或表达式的值
            *
            * ViewData
            * * 对 ViewData 的每次赋值, 都是一次 "封箱" 操作 (存疑)
            * * 对 ViewData 的每次读取, 都是一次 "拆箱" 操作 (存疑)
            * * 是 Key/Value 字典集合 ( ViewDataDictionary<dynamic>.ViewData { get; set; } )
            * * 需要进行类型转换
            *
            * ViewBag
            * * 可称为是 ViewData 的语法糖
            * * 是 dynamic 类型对象 ( WebViewPage.ViewBag { get; } )
            * * 不需要进行类型转换
            *
            * ViewData 与 ViewBag 在应用中的缺陷
            * (强制转换类型导致效率低, 没有类型安全容易运行时出错, 数据的收发之间没有正确的连接(这一点见下方分析))
            * * MVC 中, Controller 和 View 是松散的连接的 ( Controller 与 View 两者之间无法捕获对方的变化 )
            * * 如此造成在编写 View 时, 必须记住 Controller 中设置的值是什么
            * * 比如写 ViewData["vdEmployee"]、ViewBag.vbEmployee 时就必须知道在 Controller 中定义了 vdEmployee 和 vbEmployee
            * * 为解决此问题便出现了 "强类型 View "
            *
            * 如果在页面开头 @using WebAppMVCTest01.Models
            * 则可以将声明语句缩短为 Employee vdEmp = (Employee)ViewData["vdEmployee"];
            * 对应强类型的创建也可以缩短为 @model Employee    (其实也是语法糖)
            *
            * 强类型 View
            * * 在页面开头 @model + model 的类全称以创建强类型
            * * 一个 View 中只能为一个 Model 设置使用强类型
            * * 如果希望使用多个 Model 则需要用到 ViewModel ( ASP.NET MVC 应用中隐式声明的层 )
            *
            * MVC : 数据库逻辑层、数据访问层、业务层
            * * 数据库逻辑层
            * * 数据访问层    MVC 中其实不包含 "数据访问层" 的定义, 但 ASP.NET MVC 中一直隐式存在着 "数据访问层"
            * * 业务层        业务层是解析器的先驱, 是 Model 的一部分
            * *
            * * 
        ***************************************************************************************************************************@
    </div>

    <div>
        @{
            //实例化 Employee 类, 并从 ViewData 将值读入
            //这里需要 强制转换类型 是因为 ViewData 可操作内部对象, 每次添加新值, 会封装成对象类型, 因此每次都需要解压来提取值
            WebAppMVCTest01.Models.Employee vdEmp = (WebAppMVCTest01.Models.Employee)ViewData["vdEmployee"];

            //虽然传递到此页面的 "vdEmployee" 是 ViewData ,但是这里也可以将他获取为 ViewBag ,因为后者只是前者的语法糖
            WebAppMVCTest01.Models.Employee vd2vbEmp = ViewBag.vdEmployee;


            //实例化 Employee 类, 并从 ViewBag 将值读入
            WebAppMVCTest01.Models.Employee vbEmp = ViewBag.vbEmployee;

            //虽然传递到此页面的 "vbEmployee" 是 ViewBag ,但是这里也可以将他获取为 ViewData
            WebAppMVCTest01.Models.Employee vb2vdEmp = (WebAppMVCTest01.Models.Employee)ViewData["vbEmployee"];
        }
        <br />
        <b>Employee Details</b><br />
        <br />

        @*引用实例化后的 Employee 类的属性输出结果*@

        @*使用 ViewData*@
        Employee Name : @vdEmp.FirstName @vdEmp.LastName<br />
        @if (vd2vbEmp.Salary > vb2vdEmp.Salary) //使用 Razor 代码控制输出格式 方法一
        {
            <span style="background-color:yellow">Employee Salary : @vd2vbEmp.Salary.ToString("c")</span><br />
        }
        else
        {
            <span style="background-color:green">Employee Salary : @vd2vbEmp.Salary.ToString("c")</span><br />
        }
        <br />

        @*使用 ViewBag*@
        Employee Name : @vbEmp.FirstName @vbEmp.LastName<br />
        Employee Salary : @vb2vdEmp.Salary.ToString("c")<br />
        <br />

        @*使用强类型*@
        Employee Name : @Model.FirstName @Model.LastName<br />
        @{ string strColor = (Model.Salary > vb2vdEmp.Salary) ? "yellow" : "green"; } @*使用 Razor 代码控制输出格式 方法二*@
        <span style='background-color:@strColor'>Employee Salary : @Model.Salary.ToString("c")</span> @*此处使用行内表达式时, 要改双引号为单引号*@
</div>
    @{
        //此方法向页面开始位置前输出字符串, 并回车转行
        Response.Write("Hello!");
    }
    <div>
        <br />
        显式的联系：
        <label for="txtName">Input your Name:</label>
        <input type="text" id="txtName" />
        <br />
        隐式的联系：
        <label>Input your Salary: <input type="text" name="txtSalary" /></label>
        @*@{
            var str = "";
            if (!IsPost)
            {
                var name = Request["textName"];
                var salary = Request["txtSalary"];
                if (Request["txtSalary"].AsDecimal() > @Model.Salary.ToString().AsDecimal())
                {
                    str = "Your Salary is Heighter!";
                }
                else if (Request["txtSalary"].AsDecimal() < @Model.Salary.ToString().AsDecimal())
                {
                    str = "Your Salary is Lower!";
                }
            }
        }
        <p>@str</p>*@
    </div>
</body>
</html>
